class ArrayUtils {
  /**
   * 判断数组是否为空
   * @param {Array} arr - 要判断的数组
   * @returns {boolean} 是否为空
   */
  static isEmpty(arr?: Array<any>): boolean {
    return !Array.isArray(arr) || arr.length === 0
  }

  /**
   * 清空数组的方法
   * @param array 要清空的数组
   */
  static clear<T>(array: T[]): void {
    array.length = 0
  }

  /**
   * 将传入的数据转换为数组
   * @param {any} data 需要转换为数组的数据
   * @returns {Array} 转换后的数组
   */
  static createArray(data: Array<any>): Array<any> {
    if (Array.isArray(data)) {
      return data
    }
    return data !== undefined && data !== null ? [data] : []
  }

  /**
   * 深拷贝数组
   * @param {Array} arr - 要拷贝的数组
   * @returns {Array} 深拷贝后的数组
   */
  static deepClone(arr: Array<any>): Array<any> {
    return JSON.parse(JSON.stringify(arr))
  }

  /**
   * 合并多个数组
   * @param {...Array} arrays - 要合并的数组
   * @returns {Array} 合并后的数组
   */
  static merge(...arrays: any): Array<any> {
    return [].concat(...arrays)
  }

  /**
   * 从数组中移除指定的元素
   * @param {Array} arr - 数组
   * @param {*} value - 要移除的元素
   */
  static remove(arr: Array<any>, value: any) {
    const index = arr.indexOf(value)
    if (index !== -1) {
      arr.splice(index, 1)
    }
  }

  /**
   * 查找数组中的元素索引
   * @param {Array} arr - 数组
   * @param {*} value - 要查找的元素
   * @returns {number} 元素的索引，如果未找到则返回 -1
   */
  static indexOf(arr: Array<any>, value: any): number {
    return arr.indexOf(value)
  }

  /**
   * 随机打乱数组
   * @param {Array} arr - 要打乱的数组
   * @returns {Array} 打乱后的数组
   */
  static shuffle(arr: Array<any>): Array<any> {
    for (let i = arr.length - 1; i > 0; i--) {
      const j = Math.floor(Math.random() * (i + 1))
      ;[arr[i], arr[j]] = [arr[j], arr[i]]
    }
    return arr
  }

  /**
   * 计算数组的平均值
   * @param {Array<number>} arr - 数字数组
   * @returns {number} 平均值
   */
  static average(arr: Array<number>): number {
    return this.isEmpty(arr) ? 0 : arr.reduce((sum, value) => sum + value, 0) / arr.length
  }

  /**
   * 数组是否包含某个元素
   * @param arr 数组
   * @param value 元素
   */
  static hasElement(arr: Array<any>, value: any): boolean {
    return arr.indexOf(value) !== -1
  }

  /**
   * 将数组转换为字符串
   * @param arr 数组
   * @param separator 分隔符
   */
  static toString(arr: Array<any>, separator: string): string {
    return arr.join(separator)
  }
}

export default ArrayUtils
